package com.app.web.system
import com.app.constant.CommonConstant
import com.app.model.TFunction
import com.app.model.wrapper.MessageDefined
import com.app.service.system.IFunctionService
import com.app.web.BaseAction
import groovy.transform.CompileStatic
import groovy.transform.TypeChecked
import org.apache.shiro.authz.annotation.RequiresPermissions
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component

import javax.servlet.http.HttpServletRequest
import javax.ws.rs.*
import javax.ws.rs.core.Context
import javax.ws.rs.core.MediaType
/**
 * 系统功能管理
 * Created by three on 14-9-9.
 */
@Component
@CompileStatic
@TypeChecked
@Path('/system/func')
class FunctionAction extends BaseAction {

    @Autowired
    private IFunctionService funcService;

    /**
     * 得到所有菜单
     */
    @Path("/")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @RequiresPermissions("function:list")
    list(@Context HttpServletRequest request,
         @QueryParam("funcName") String funcName,
         @QueryParam("funcCode") String funcCode,
         @QueryParam("funcAction") String funcAction,
         @QueryParam("funcAuthorize") String funcAuthorize,
         @QueryParam("funcIco") String funcIco
         ) {
        CommonParams commonParams = getCommonParams(request)

        def param = new HashMap<String, Object>();
        param.put('isActive', CommonConstant.IsActive.TRUE.getValue());
        param.put('funcName', funcName);
        param.put('funcCode', funcCode);
        param.put('funcAction', funcAction);
        param.put('funcAuthorize', funcAuthorize);
        param.put('funcIco', funcIco);

        funcService.findListByParams(param, commonParams.order);
    }

    /**
     * 加入根菜单，支持批量加入
     */
    @Path("/")
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @RequiresPermissions("function:add")
    add(@BeanParam TFunction function) {
        if(''==function.funcName || ''==function.funcCode) {
            return MessageDefined.ERROR.wrapperMsg('功能名称或代码不能为空');
        }
        function.isActive = CommonConstant.IsActive.TRUE.getValue();
        // 其他有效性检查
        Long funcId = (Long)funcService.addBasic(function);
        MessageDefined.SUCCESS.wrapper([funcId: funcId], '新增功能成功')
    }

    /**
     * 得到菜单详情，包括子菜单
     */
    @Path("/{funcId}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @RequiresPermissions("function:detail")
    detail(@PathParam("funcId") Long id) {
        MessageDefined.SUCCESS.wrapper(funcService.findObjByKey(id))
    }

    /**
     * 修改菜单基本信息，不含子菜单
     */
    @Path("/{funcId}")
    @PUT
    @Produces(MediaType.APPLICATION_JSON)
    @RequiresPermissions("function:modify")
    edit(@PathParam("funcId") Long id, @BeanParam TFunction func) {
        func.id = id
        try{
            funcService.modifyBasic(func)
            MessageDefined.SUCCESS.wrapper(func, '更新功能成功')
        } catch(Exception  e) {
            logger.info("修改功能点异常", e);
            MessageDefined.ERROR.wrapper(func, '更新功能失败')
        }
    }

    /**
     * 删除菜单，会删除子菜单
     */
    @Path("/{funcId}")
    @DELETE
    @Produces(MediaType.APPLICATION_JSON)
    @RequiresPermissions("function:delete")
    delete(@PathParam("funcId") Long id) {
        funcService.delBasic(new TFunction(id: id));
        MessageDefined.SUCCESS.wrapper([id: id], '删除功能成功')
    }

    /**
     * TODO 由于使用upId标志，此方法很少会调用，是否需要改善设计
     * 增加子菜单，支持批量添加
     */
    @Path("/{funcId}")
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @RequiresPermissions("function:add")
    addChild(@PathParam("funcId") Long id,
             @BeanParam TFunction function) {
        if(''==function.funcName || ''==function.funcCode) {
            return MessageDefined.ERROR.wrapperMsg('功能名称或代码不能为空');
        }

        // 其他有效性检查
        function.isActive = CommonConstant.IsActive.TRUE.getValue();
        function.upId = id;

        Long funcId = (Long)funcService.addBasic(function);
        return MessageDefined.SUCCESS.wrapper([funcId: funcId], '新增功能成功');
    }
}
